package com.kuangstudy.aop.log;


import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.checkerframework.common.value.qual.ArrayLen;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Aspect
@Slf4j
@Order(-1)
public class LogAspect {

    @Pointcut("@annotation(com.kuangstudy.aop.log.KsdLog)")
    public void LogPointcut() {
    }

    @Around("LogPointcut()")
    public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.info("LogAspect----------------------------");
        // 1、方法执行之前的时间
        long starttime = System.currentTimeMillis();
        // 2、执行真正的方法
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        System.out.println(signature.getMethod().getName());
        System.out.println(signature.getReturnType().getName());
        System.out.println(signature.getParameterNames());
        System.out.println(signature.getParameterTypes());
        // 核心代码 这个方法前后通知的分界线
        Object methodReturnValue = proceedingJoinPoint.proceed();

        log.info("当前方法的返回值是:{}",methodReturnValue);
        // 3、方法执行的结束时间
        long endtime = System.currentTimeMillis();
        // 4、方法总耗时
        long totaltime = endtime - starttime;
        log.info("当前方法:{},执行时间是{}ms",signature.getMethod().getName(),totaltime);
        // 5、日志收集 es redis mq kafka 存储

        // 6、将方法的返回值抛出去
        return methodReturnValue;

    }


}
